PACKAGE SIZE
Informationen zum PACKAGE SIZE-Zusatz des SELECT-Befehls. In diesem Artikel zeigen wir eine Möglichkeit, die Verarbeitung von Paketen Ereignisgesteuert auszuführen. Sicherlich keine Revolution, aber so geht’s eben auch…
Standard
Um Daten Stück für Stück von der Datenbank zu lesen, ist der PACKAGE SIZE-Zusatz die erste Wahl:
*** Read data
SELECT * FROM vbak
PACKAGE SIZE 1000
INTO TABLE lt_vbak
WHERE auart = iv_auart.
*** Start processing read data
PERFORM verarbeitung USING lt_vbak.
ENDSELECT.
Erweiterung
Das oben genannte Coding funktioniert natürlich nur, wenn die Datenselektion und die Verarbeitung innerhalb eines Programms statt finden. Kniffeliger wird es dann schon, wenn die Datenbeschaffung in einer Methode ausgeführt wird.
Hier kann man sich aber das Eventhandling zu nutze machen: Wird der Datenbeschaffungsmethode keine “Paketgröße” mitgegeben, so werden alle Daten selektiert und zurück gegeben.
Bei Übergabe einer Paketgröße wird jedoch stückchenweise gelesen und die Daten des Pakets mittels “RAISE EVENT” zur Verfügung gestellt.
Das Ganze kann dann in etwa so aussehen:
Klasse ZCL_DATA
Methode GET_DATA
METHOD get_data. “PUBLIC STATIC METHOD
*———————————————————————
* Schnittstelle:
* Importing: IV_AUART TYPE AUART “Verkaufsbelegart
* Importing: IV_PACKAGE_SIZE TYPE I DEFAULT 0 “Paketgröße
* Exporting: ET_VBAK TYPE VBAK_T “Tabellentyp VBAK
*———————————————————————
DATA lt_vbak TYPE vbak_t.
IF iv_package_size IS INITIAL.
*** Read data complete
SELECT * FROM vbak
INTO TABLE et_vbak
WHERE auart = iv_auart
AND ernam = sy-uname.
ELSE.
*** Read data in packets
SELECT * FROM vbak
PACKAGE SIZE iv_package_size
INTO TABLE lt_vbak
WHERE auart = iv_auart
AND ernam = sy-uname.
RAISE EVENT package_read EXPORTING et_vbak = lt_vbak.
ENDSELECT.
ENDIF.
ENDMETHOD.
Ereignis PACKAGE_READ
Public, static
Parameters: ET_VBAK TYPE VBAK_T
Verarbeitungsprogramm
In diesem Beispiel wird die statische Methode der Klasse ZL_DATA verwendet, um die Tabelle VBAK zu lesen.
Um das Event PACKAGE_READ der Klasse ZCL_DATA abzufangen, wurde die lokale Klasse ZCL_GET_PACKAGE erzeugt.
Wenn die Datenverarbeitung schon modular aufgebaut war, so ist die Änderung auf paketweise Verarbeitung recht gering.
Hinweis:
Diese Verarbeitungslogik offenbart dann ihre Tücken, sobald die Sätze voneinander abhängen. In diesem Fall könnten das Aufträge sein, die durch Submissionsnummern “verbunden” sind oder sobald alle Aufträge eines Tages zusammen verarbeitet werden sollen.
DATA gt_vbak TYPE vbak_t.
FIELD-SYMBOLS <vbak> TYPE vbak.
PARAMETERS p_auart TYPE auart DEFAULT ‘SO’.
PARAMETERS p_psize TYPE i DEFAULT 0.
*———————————————————————-*
* CLASS zcl_get_package DEFINITION
*———————————————————————-*
CLASS zcl_get_package DEFINITION.
PUBLIC SECTION.
CLASS-METHODS get_package FOR EVENT package_read
OF zcl_data
IMPORTING et_vbak .
ENDCLASS. “zcl_get_package DEFINITION
*———————————————————————-*
* CLASS zcl_get_package IMPLEMENTATION
*———————————————————————-*
CLASS zcl_get_package IMPLEMENTATION.
METHOD get_package.
PERFORM print_data USING et_vbak.
uline.
ENDMETHOD. “get_package
ENDCLASS. “zcl_get_package IMPLEMENTATION
START-OF-SELECTION.
IF p_psize = 0.
*** get data complete
CALL METHOD zcl_data=>get_data
EXPORTING
iv_auart = p_auart
IMPORTING
et_vbak = gt_vbak.
PERFORM print_data USING gt_vbak.
ELSE.
*** Set Handler to register event
SET HANDLER zcl_get_package=>get_package.
*** Get data package by package
CALL METHOD zcl_data=>get_data
EXPORTING
iv_auart = p_auart
iv_package_size = p_psize.
ENDIF.
*&———————————————————————*
*& Form print_data
*&———————————————————————*
FORM print_data USING it_vbak TYPE vbak_t.
LOOP AT it_vbak ASSIGNING <vbak>.
WRITE: / <vbak>-vbeln.
ENDLOOP.
ENDFORM. “print_data
- Meine Eclipse-Plugins - 22. November 2024
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024